ChatGPTで仕事を効率化しよう!写真や画像はスクリプトで自動で整理できるよね!事例

ChatGPTで仕事を効率化しよう!写真や画像はスクリプトで自動で整理できるよね!事例

この自動振り分けスクリプトを作るまでは、フォルダだけまとめて作るスクリプトを用意して、手動で振り分けてたので、個人的にはめちゃめちゃ生産性?上がったんですよね。
Clock Icon2024.11.20

私はスマホの容量が本当になくて、定期的に画像や動画をパソコンに送ってからクラウド上に保管してます。それらは、日付ごとのフォルダに手動で分けてたんですが、「いや、これどう考えても面倒臭いだろ」とやっと思いまして。

ChatGptになにげなく聞いたら解決できたので、その方法を紹介します。

そもそも、なぜ仕事効率化にChatGPTを活用するべきなのか?

1. 時間短縮

日々の業務で反復的なタスクは避けられません。ChatGPTを使えば、そうした単調な作業を自動化するツールを効率的に作成できます。今回紹介するスクリプトは、その代表的な例です。

2. 初心者でも使いやすい

プログラミングに詳しくない人でも、ChatGPTを活用すればシンプルなスクリプトを簡単に作成できます。わからない部分を質問すれば、実行可能なコードがすぐに手に入ります。(動かない時も多いけど、エラーメッセージを伝えると解決することも、たまにある)

3. 業務フローの最適化

ChatGPTは、単なるコード作成だけでなく、業務全体のフローを見直し、より効率的な方法を提案してくれるパートナーとしても活躍します。(やりとりをしているうちに、このフローそもそもいるんだっけ?って思うことはあります)

写真整理スクリプトの概要

今回ご紹介するスクリプトは、写真や動画ファイルを撮影日別のフォルダに自動で振り分けるものです。
これにより、膨大なファイルを一つずつ手作業で仕分ける手間を省きます。

主な機能

  1. 撮影日を自動取得
    JPEG、PNG、HEIC、MOVなど、複数のファイル形式に対応しています。Exif情報やファイル作成日を基に、正確な撮影日を取得します。

  2. フォルダを自動生成
    撮影日ごとにフォルダを作成し、ファイルを適切に振り分けます。

  3. ユーザー入力による柔軟性
    読み込むフォルダパスをユーザーが指定できるため、様々な環境で簡単に活用できます。

スクリプトの全体像

import os
import subprocess
from PIL import Image
from PIL.ExifTags import TAGS
from datetime import datetime
import shutil

def get_photo_date(photo_path):
    print(f"Processing file: {photo_path}")
    if photo_path.lower().endswith(('.jpg', '.jpeg', '.png')):
        image = Image.open(photo_path)
        exif_data = image._getexif()
        if exif_data:
            for tag, value in exif_data.items():
                tag_name = TAGS.get(tag, tag)
                if tag_name == 'DateTimeOriginal':
                    print(f"Date found in EXIF for {photo_path}: {value}")
                    return value
        print(f"No EXIF date found for {photo_path}")
    elif photo_path.lower().endswith('.heic'):
        result = subprocess.run(['exiftool', '-DateTimeOriginal', '-d', '%Y:%m:%d %H:%M:%S', photo_path], capture_output=True, text=True)
        for line in result.stdout.splitlines():
            if 'Date/Time Original' in line:
                date_str = line.split(': ', 1)[1]
                print(f"Date found in EXIF for {photo_path}: {date_str}")
                return date_str
    elif photo_path.lower().endswith('.mov'):
        stat = os.stat(photo_path)
        creation_time = stat.st_birthtime
        date_str = datetime.fromtimestamp(creation_time).strftime('%Y:%m:%d %H:%M:%S')
        print(f"Creation date for {photo_path}: {date_str}")
        return date_str
    # ファイルの作成日を取得
    stat = os.stat(photo_path)
    creation_time = stat.st_birthtime if hasattr(stat, 'st_birthtime') else stat.st_mtime
    date_str = datetime.fromtimestamp(creation_time).strftime('%Y:%m:%d %H:%M:%S')
    print(f"File creation date for {photo_path}: {date_str}")
    return date_str

def parse_date(date_str):
    date_formats = ['%Y:%m:%d %H:%M:%S', '%Y:%m:%d', '%Y.%m.%d']
    for date_format in date_formats:
        try:
            return datetime.strptime(date_str, date_format)
        except ValueError:
            continue
    raise ValueError(f"time data '{date_str}' does not match any known format")

def create_folder_by_date(base_path, date_str):
    date = parse_date(date_str)
    folder_name = date.strftime('%y%m%d')
    folder_path = os.path.join(base_path, folder_name)
    if not os.path.exists(folder_path):
        os.makedirs(folder_path)
    return folder_path

def move_photo_to_folder(photo_path, dest_folder):
    shutil.move(photo_path, os.path.join(dest_folder, os.path.basename(photo_path)))

def sort_photos(base_paths):
    for base_path in base_paths:
        print(f"Sorting photos in directory: {base_path}")
        if not os.path.exists(base_path):
            print(f"Error: Directory {base_path} does not exist.")
            continue

        for filename in os.listdir(base_path):
            file_path = os.path.join(base_path, filename)
            if os.path.isfile(file_path) and filename.lower().endswith(('.jpg', '.jpeg', '.png', '.heic', '.mov')):
                date_str = get_photo_date(file_path)
                if date_str:
                    try:
                        dest_folder = create_folder_by_date(base_path, date_str)
                        move_photo_to_folder(file_path, dest_folder)
                        print(f"Moved {filename} to {dest_folder}")
                    except ValueError as e:
                        print(f"Error processing {filename}: {e}")
                else:
                    print(f"No valid date found for {filename}, file not moved.")

if __name__ == "__main__":
    # ユーザーにフォルダパスの入力を求める
    user_input = input("Enter the path of the folder to organize photos: ")
    base_paths = [user_input.strip()]
    sort_photos(base_paths)

スクリプトの実行方法(Macの場合)

以下は、Pythonをインストールし、スクリプトを実行するための最も簡単な手順です。

1. Pythonのインストール

  1. Python公式サイトにアクセスします。

  2. トップページの「Download」セクションから、「Download Python 3.x.x」(最新バージョン)をクリックしてダウンロードします。

  3. ダウンロードしたインストーラ(.pkgファイル)を開き、画面の指示に従ってインストールします。

  4. インストール完了後、ターミナルを開いて以下のコマンドを実行し、Pythonが正しくインストールされたことを確認します。

    python3 --version
    

実行結果にPythonのバージョン(例: Python 3.10.9)が表示されれば、インストール成功です。

2. 必要なライブラリのインストール

スクリプトで使用するライブラリ(Pillow)をインストールします。

  1. ターミナルを開き、以下を入力してpipを使ってライブラリをインストールします。
python3 -m pip install pillow
  1. ExifTool をダウンロードします。
  2. ExifTool公式サイトにアクセスします。
  3. ページから「MacOS Package」をダウンロードし、インストールします。
  4. インストール後、以下をターミナルで入力し、ExifToolが正しく動作していることを確認します。
exiftool -ver

バージョン番号が表示されれば成功です。

3. スクリプトの準備

  1. 上記のスクリプトをテキストエディタに貼り付けます。
  2. ファイル名を photo_sorter.py として保存します。

4. スクリプトの実行

  1. ターミナルを開き、スクリプトを保存したディレクトリに移動します。
    例: スクリプトを「ダウンロード」フォルダに保存した場合
cd ~/Downloads
  1. スクリプトを実行します。
python3 photo_sorter.py
  1. 実行後、「Enter the path of the folder to organize photos:」と表示されるので、整理したいフォルダのパスを入力します。
    例:
    Enter the path of the folder to organize photos: /Users/YourName/Pictures

  2. 指定したフォルダ内の写真や動画が撮影日別のフォルダに自動で振り分けられます。

5. 実行結果の確認

フォルダ内を確認すると、撮影日ごとにフォルダ(例: 231114)が作成され、写真や動画が移動しているはずです。

トラブルシューティング

  • Pillowが見つからないエラー: 再度以下を実行してください。
python3 -m pip install pillow
  • ExifToolが動作しないエラー: ExifToolを再インストールし、ターミナルで動作確認を行ってください。

こんな場面で使えます

ほかにスクリーンショットの分別も便利かなと思います。

Case1. マーケティング業務での写真整理

マーケティング現場で、日々増加する写真や動画を手作業で整理するのは大変です。このスクリプトを活用すれば、SNS運用やレポート作成の効率が劇的に向上します。

Case2. イベント撮影データの管理

イベントで撮影した数百枚の写真を、フォルダごとに整理する負担を軽減できます。スタッフの時間を節約し、クライアントへの迅速な納品が可能です。

Case3. 個人の写真バックアップ

家族や旅行の写真を撮影日ごとに整理し、クラウドストレージにアップロードする際の手間を削減できます。

まとめ

いまも日常的にChatGPTを使ってて、「これ、できたらいいな」ってテキトーに投げたプロンプトは大体失敗しがちです。

でも、本当にこれがやりたいんだ!って明確なものであれば、解決することが多いかも?って思います。

だから、人への対応と同じなんだなと。

結果がうまく返ってこないのは、自分のせいだなと冷静に思えたり、それを誰かへの指示に活かせるのはとってもいいことだなと思います。

そして、何も言わずとも、行間を読める人でありたいなとも思う。(このように、ポエムで締めるのが人間味)

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.